package vip.meeet.base;

public class ExceptionStart {

    /**
     * 1.在执行try块之前直接return，我们发现finally块是不会执行的
     * @return
     */
    private static int tryBeforeReturn() {
        int i = 11;
        if (i == 11) {
            return i;
        }
        try {
            System.out.println("执行try");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    /**
     * try中exit，finally不会执行
     * @return
     */
    private static int tryExit() {
        try {
            System.out.println("执行try");
            System.exit(0);
        } catch (Exception e) {
            System.out.println("执行catch");
        } finally {
            System.out.println("执行finally");
        }
        return 0;
    }

    /**
     * 1. finally块执行在try块的return之前
     * 2. finally执行在catch块return的执行前
     * @return
     */
    private static int finallyExeTime() {
        try {
            System.out.println("执行try");
            return 1 / 0;
        } catch (Exception e) {
            System.out.println("执行catch");
            return 11;
        } finally {
            System.out.println("执行finally");
        }
    }

    /**
     * finally块中的返回值:
     * Java程序会把try或者catch块中的返回值保留，也就是暂时的确认了返回值，然后再去执行finally代码块中的语句。
     * 等到finally代码块执行完毕后，如果finally块中没有返回值(return)的话，就把之前保留的返回值返回出去
     * @return
     */
    private static int finallyReturn() {
        int i = 0;
        try {
            System.out.println("执行try：" + i);
            return i;
        } finally {
            ++i;
            System.out.println("执行finally：" + i);
        }
    }

    public static int print() {
        int i = 0;
        try{
            ++i;
        }finally {
            ++i;
        }
        return ++i;
    }


    public static void main(String[] args) {
//        System.out.println("执行main：" + tryBeforeReturn());
        System.out.println(print());
    }
}
